[명령어] VIM 사용법

NOTE

Vim 편집기 기본 사용법 정리. 커서·화면 이동, 수정/복사/붙여넣기/삭제, 검색·치환, 창 분할, 행 이동, Control 문자 표기.

NOTE

원문의 방향키(h/j/k/l), 분할 명령 방향, x 동작 등 일반지식 오류를 교정함(사실 확인 권장).

📌 개념

Vim은 명령 모드(이동/편집 명령)와 입력 모드(텍스트 입력)를 분리해, 손을 홈 로우에서 떼지 않고 마우스 없이 파일을 탐색·수정할 수 있게 설계됐다. 리눅스 서버에는 GUI 에디터가 없는 경우가 많아, 원격 접속 환경에서 텍스트/설정 파일을 편집할 표준 도구로 널리 쓰인다.

자주 쓰는 명령:

  • 복사: yiw(현재 단어 복사), [숫자]yy(현재 커서 기준 n줄 복사)
  • 되돌리기: u(이전 실행 취소), Ctrl + r(다시 실행)

💻 예시

글자 이동

방향키로 한 글자씩 이동하는 대신 단어/행 단위로 점프해 이동 속도를 높이기 위한 명령들이다.

  • w: 다음 단어 첫 글자
  • e: 다음 단어 마지막 글자
  • b: 이전 단어 첫 글자
  • 0: 현재 행의 맨 앞
  • $: 현재 행의 맨 끝

화면 이동

큰 로그/설정 파일을 스크롤 없이 페이지 단위로 빠르게 훑어보기 위한 명령들이다.

  • Ctrl + b: 한 화면 위로 (page up)
  • Ctrl + f: 한 화면 아래로 (page down)
  • Ctrl + u / Ctrl + d: 반 화면 위/아래
  • Ctrl + y / Ctrl + e: 한 행 위/아래

커서 이동 (h/j/k/l)

  • h: 왼쪽
  • j: 아래
  • k: 위
  • l: 오른쪽

수정

x+i로 지우고 다시 입력 모드에 들어가는 대신, “삭제와 동시에 입력 모드 진입”을 한 번에 처리해 타이핑 수를 줄이는 명령들이다.

  • r: 커서 위치 한 글자 수정
  • cw: 현재 단어 끝까지 수정
  • [숫자]s: n글자 수정 (ex: 5s = 5글자 수정)
  • C: 커서 위치부터 행 끝까지 수정

복사 / 붙여넣기 / 삭제

  • yy: 한 줄 복사
  • p: 붙여넣기
  • dd: 한 줄 삭제
  • x: 한 글자 삭제
  • J: 아래 줄을 현재 줄로 끌어올리기

선택 (비주얼 모드)

여러 줄/여러 글자를 한 번에 지우거나 복사해야 할 때, 마우스 드래그 없이 키보드만으로 범위를 지정하기 위한 모드다.

  • Ctrl + v: 블록(범위) 선택
  • Shift + v: 한 줄 선택

줄 번호 / 찾기 / 치환

:set nu                       " 줄 번호 표시
/검색어                        " 커서 아래 방향 검색
?검색어                        " 커서 위 방향 검색
n / N                         " 다음 / 이전 검색 결과로 이동
:%s/대상문자열/변경문자열/g     " 파일 전체에서 대상 문자열을 변경문자열로 치환

커서 아래 단어 강조 검색 (* / # / hlsearch)

커서를 단어 위에 놓고 키를 누르면 파일 안의 같은 단어를 전부 형광펜으로 칠해주는 동작이다 — 검색과 하이라이트 두 가지가 결합된 기능이다.

*    " 커서 아래 단어를 정확히 일치(단어 경계 기준)로 아래 방향 검색 + 다음 위치로 점프
#    " 같은 방식으로 위 방향 검색 + 이전 위치로 점프
g*   " 단어 경계 무시하고 부분 일치까지 검색 (예: foo 커서에서 foobar도 걸림)
g#   " g*의 위 방향 버전
  • 검색된 단어가 화면 전체에서 색칠되어 보이는 건 */# 자체 기능이 아니라 hlsearch 옵션이 켜져 있어서다.
:set hlsearch    " 검색 결과 전부 하이라이트 (기본 꺼져 있는 배포판도 있음)
:set incsearch   " 검색어 입력 중에도 실시간으로 미리 하이라이트
  • 하이라이트를 잠깐 끄고 싶을 때(색칠이 거슬릴 때): :noh (:nohlsearch의 축약). 검색 자체를 끄는 게 아니라 지금까지의 하이라이트만 지운다 — n/N으로 다시 이동하면 하이라이트가 다시 켜진다.

~/.vimrc에 자주 추가하는 조합

set hlsearch
set incsearch
nnoremap <silent> <C-l> :nohlsearch<CR>   " Ctrl+L 한 번으로 하이라이트 끄기

셸 명령 실행 / 잡 제어

:!명령어      " vim 안에서 셸 명령 실행 (결과 확인 후 Enter 누르면 vim으로 복귀)
:sh          " 셸로 나감 (되돌아오기: exit)
Ctrl + z     " vim 창 내리기(백그라운드)
fg           " vim으로 되돌아오기

:!명령어에서 %는 현재 편집 중인 파일명으로 치환된다. 지금 보던 파일의 특정 줄 범위를 바로 확인할 때 유용하다.

:!sed -n '344,410p' %          " 현재 파일의 344~410줄만 출력
:r !sed -n '344,410p' 다른파일   " 명령 결과를 커서 아래에 삽입
:344,410!sed 's/old/new/g'     " 344~410줄을 명령 출력으로 교체 (실행 전 저장 또는 u로 되돌리기)

창(윈도우) 분할

두 파일을 비교하거나(예: 설정 파일 원본과 수정본), 한 파일의 다른 위치를 동시에 참고하며 편집할 때 화면을 나눠 쓰기 위한 기능이다.

  • 수평 분할(위아래): 같은 파일 :[크기]sp, 다른 파일 :[크기]sp [파일명] (추천 크기 30)
  • 수직 분할(좌우): 같은 파일 :[크기]vs, 다른 파일 :[크기]vs [파일명] (추천 크기 100)
  • 다음 창으로 커서 이동: Ctrl + w, w
  • 현재 창만 두고 나머지 닫기: Ctrl + w, o
  • 여러 파일을 열었을 때 다음 문서: :n

행 이동

  • gg: 첫 행으로 이동
  • [숫자]G (숫자 입력 + Shift + g): 원하는 행 번호로 이동
  • G (Shift + g): 맨 끝 행으로 이동
  • Home: 행의 첫 번째로 이동
  • $ (Shift + 4): 행의 마지막 문자로 이동

Control 문자 표기법

입력 방법: Ctrl + v → Ctrl + [원하는 문자]

예) Ctrl + v → Ctrl + m → ^M

Untitled

추가로 자주 쓰는 명령

사용법설명비고
gg=G문서 전체 자동 정렬(들여쓰기)
U현재 커서 위치 줄 전체를 되돌리기undo (u는 마지막 실행 하나만 되돌림)
Ctrl + u(입력 모드) 커서 위치부터 줄 시작까지 삭제insert 모드 전용, 위 화면 이동의 Ctrl+u(반 화면 위)와는 모드가 다름
:[범위]s/[기존단어]/[새단어]/gc단어 바꾸기, 바꿀 때마다 확인 절차 추가예: :%s/OLD_NAME/NEW_NAME/gc
gg + Ctrl+v + G + y문서 전체를 비주얼 블록으로 선택해 복사
:vsp [경로] / :sp [경로]좌우 / 상하 분할하며 파일 열기위 “창 분할” 항목의 :vs/:sp와 동일 계열, 분할과 동시에 다른 파일을 바로 열 때

파일 탐색기(디렉터리 트리) 자동 표시 — netrw

vim은 플러그인 없이도 디렉터리 탐색기가 내장되어 있다. 이름은 netrw. 별도 설치 없이 바로 쓸 수 있다.

지금 당장 켜보기

vim .           # 현재 폴더를 넘기면 netrw가 자동으로 디렉터리 목록을 보여줌
vim 폴더경로/    # 특정 폴더를 지정해도 동일

netrw 창 안에서: Enter로 파일/폴더 열기, -로 상위 폴더로, %로 새 파일 생성, d로 새 디렉터리 생성.

파일을 열 때마다 사이드바로 자동으로 같이 띄우기

vim main.c처럼 파일 하나만 지정해서 열어도 왼쪽에 트리를 자동으로 띄우려면 ~/.vimrc에 설정을 추가해야 한다.

let g:netrw_banner = 0       " netrw 상단 안내 배너(도움말 텍스트) 숨기기
let g:netrw_liststyle = 3    " 들여쓰기된 트리 모양으로 표시 (0: 한 줄씩, 1: 상세, 2: 넓게)
let g:netrw_winsize = 25     " 사이드바 폭 (창 전체 폭의 25%)
 
autocmd VimEnter * ++nested Lexplore | wincmd p
  • Lexplore는 netrw를 왼쪽 고정 사이드바로 여는 명령이다(일반 Explore/Vexplore는 그냥 창 분할이라 탐색기 창과 파일 창을 계속 오가며 쓰기 불편함).
  • autocmd VimEnter * ... Lexplore | wincmd p는 “vim이 켜질 때 사이드바를 열고, 곧바로 커서를 원래 파일 창으로 돌려놔라”는 뜻이다 — 이게 없으면 vim을 열 때마다 커서가 탐색기 창에 가 있어서 바로 타이핑을 못 한다.

자동 실행이 거슬리면 토글 방식으로

커밋 메시지 편집(git commit), diff 모드 등 vim이 다른 용도로 열릴 때도 매번 사이드바가 뜨는 게 번거로울 수 있다. 이럴 때는 autocmd VimEnter 자동 실행 대신 단축키로 필요할 때만 토글하는 방식을 더 선호한다.

nnoremap <leader>e :Lexplore<CR>   " 예: 스페이스+e 로 켜고 끄기

NERDTree와의 차이

검색해보면 흔히 나오는 NERDTree는 플러그인(vim-plug 등 플러그인 매니저 설치 필요)이고, 여기서 설명한 netrw는 vim 자체 내장 기능이라 폐쇄망·구버전 vim에서도 추가 설치 없이 바로 쓸 수 있다는 차이가 있다. 기능은 NERDTree가 아이콘·Git 상태 표시 등으로 더 화려하지만, 터미널 환경에서 디렉터리 트리 자체가 목적이면 netrw만으로 충분하다.